//SCALA LICENSE
//
//Copyright (c) 2002-2008 EPFL, Lausanne, unless otherwise specified.
//All rights reserved.
//
//This software was developed by the Programming Methods Laboratory of the
//Swiss Federal Institute of Technology (EPFL), Lausanne, Switzerland.
//
//Permission to use, copy, modify, and distribute this software in source
//or binary form for any purpose with or without fee is hereby granted,
//provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright
//      notice, this list of conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright
//      notice, this list of conditions and the following disclaimer in the
//      documentation and/or other materials provided with the distribution.
//
//   3. Neither the name of the EPFL nor the names of its contributors
//      may be used to endorse or promote products derived from this
//      software without specific prior written permission.
//
//
//THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
//ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
//IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
//ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
//FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
//DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
//CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
//LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
//OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
//SUCH DAMAGE.
  
package scala.tools.eclipse;

import org.eclipse.core.runtime._;

/** 
 * Abstract class for all Eclipse plugins written in scala.  Should ease development
 * This code was pulled from the Scala Eclipse Plugin.
 */
trait ScalaEclipsePlugin extends org.eclipse.core.runtime.Plugin {

  /** The string ID of the plugin. */
  val pluginId : String;
  
  /** error logging */
  final def logError(msg : String, t : Throwable) : Unit = {
    var tt = t
    if (tt == null) tt = try {
      throw new Error
    } catch {
      case e : Error => e
    }
    val status = new Status(IStatus.ERROR, pluginId, IStatus.ERROR, msg, tt)
    log(status)
  }
  
  /** Logs an exception to the eclipse logger*/
  final def logError(t : Throwable) : Unit =  logError("", t);
  
  /** Attempts to perform the function f.  On success, returns a defined Option.  On failure, logs the exception and returns None.*/
  final def checkedDo[T](f : => T) = try { Some(f) } catch {
    case e : Throwable => logError(e); None
  }
  
  /** Logs an eclipse status object to the eclispe log */
  protected def log(status : Status) = getLog.log(status)
}